package com.alex.controller;

import cn.hutool.core.util.StrUtil;
import cn.hutool.db.Db;
import cn.hutool.db.Entity;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.alex.common.beans.ResultBean;
import com.alex.entityVo.ArticleSearchVo;
import com.alex.sevice.StaticService;
import common.beans.User;
import common.util.PmidUtils;
import common.util.PublicPiYin;
import common.util.UserUtil;
import common.util.YouDaoTransLate;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;
import java.sql.SQLException;
import java.util.*;
import java.util.stream.Collectors;

@RequestMapping("/high_scoring_topics")
@RestController
@Tag(name = "高分选题")
public class HighScoringTopicsController {

    public static String RESTURL_GPT = "http://10.1.1.11:28080";
    public static String RESTURL_ES = "http://10.1.1.11:29000";

    @Resource
    StaticService staticService;


    @PostMapping(value = "translate")
    public ResultBean<Object> translate(@RequestBody JSONObject jsonObject) {
        String content = jsonObject.getStr("content");
        Map<String, Object> paramMap = new LinkedHashMap<>();
        paramMap.put("q", content);
        paramMap.put("from", "en");
        paramMap.put("to", "zh-CHS");
        //119.188.182.151:18081
        String body = HttpUtil.post("https://fanyi.yuntsg.com/v2/translate_a", paramMap);
        return new ResultBean<>(body);
    }



    @Operation(summary = "高分选题,根据摘要生成课题思路", description = "接口以stream流式返回,参考各大 AI 聊天界面效果,返回结果为")
    @GetMapping("/high_scoring_topics")
    public void high_scoring_topics(@Parameter(name = "content", description = "要输入的内容", example = "传统的均匀喷洒田地来对抗杂草，需要大量的除草剂投入，成本显著，并对环境造成影响。更加专注的杂草控制方法，如基于特定位置的杂草管理（SSWM），变得越来越受欢迎，但需要方法来识别杂草位置。技术的进步为自动化方法提供了可能，例如使用无人机，也可以使用地面传感器来检测和绘制杂草。在这项研究中，评估了光探测与测距（LiDAR）传感器的能力来检测和定位杂草。为此，进行了两项试验，使用人工目标（代表杂草）在不同高度和直径下进行，以了解 LiDAR 的检测限制。结果显示，目标在不同扫描距离下从 LiDAR 探测到的能力受到目标大小及其朝向 LiDAR 的影响。第三项试验在小麦田地中进行，LiDAR 被用来扫描不同高度的不同杂草物种，以验证固定 LiDAR 在田地环境中检测杂草的能力。结果显示，LiDAR 检测到了小麦田地中的所有杂草，基于它们与作物冠层的高度差异。", required = true) String content,
                                    @Parameter(name = "user", description = "用户的登录 ID", example = "2", required = true) String user
            , HttpServletResponse httpServletResponse)
            throws IOException {

        httpServletResponse.setContentType("text/event-stream");
        httpServletResponse.setCharacterEncoding("UTF-8");
        // 禁用缓存
        httpServletResponse.setHeader("Cache-Control", "no-cache");

        String resule = "";
        if (content.equals("CRISPR")) {
            resule = "[\n" +
                    "  {\"title\": \"抗CRISPR基因对CRISPR/Cas系统影响的深入研究\", \"introduction\": \"本课题旨在探讨不同类型的抗CRISPR基因如何影响CRISPR/Cas系统的功能，通过构建含有特定抗CRISPR基因的表达载体并将其引入具有不同CRISPR/Cas系统版本的铜绿假单胞菌中，研究它们之间的相互作用机制以及宿主对噬菌体感染的防御响应。\"},\n" +
                    "  {\"title\": \"新型噬菌体抗CRISPR基因的筛选与功能验证\", \"introduction\": \"该项目计划从多种噬菌体中筛选出新型的抗CRISPR基因，并利用分子生物学技术对其进行功能验证，包括其是否能有效抑制CRISPR/Cas系统的活性、作用方式以及对不同CRISPR/Cas系统的广谱性。通过该研究可以进一步理解噬菌体与宿主间复杂的进化关系。\"},\n" +
                    "  {\"title\": \"基于抗CRISPR机制设计新型基因编辑工具\", \"introduction\": \"本研究拟利用已知的抗CRISPR蛋白开发新的基因编辑技术，通过蛋白质工程改造抗CRISPR蛋白以增强其抑制CRISPR/Cas系统的能力，从而实现更精准、高效且可控的基因编辑操作。这将有助于解决目前CRISPR/Cas系统在临床应用中遇到的部分问题。\"},\n" +
                    "  {\"title\": \"抗CRISPR基因促进噬菌体感染的分子机理探究\", \"introduction\": \"此课题聚焦于抗CRISPR基因如何帮助噬菌体克服宿主CRISPR/Cas免疫系统的研究，采用生化及结构生物学手段解析抗CRISPR蛋白的三维结构与其作用靶点的关系，揭示其分子识别和抑制机理。该研究有助于加深对抗CRISPR作用模式的理解。\"},\n" +
                    "  {\"title\": \"噬菌体携带多重抗CRISPR基因对细菌群体的影响分析\", \"introduction\": \"本项目探索携带多个不同抗CRISPR基因的噬菌体在细菌群体中的传播动态及其长期适应性演化过程。结合实验室感染实验与数学建模的方法，评估多重抗CRISPR基因组合对细菌群体多样性的影响，从而预测未来可能出现的新抗性模式。\"}\n" +
                    "]";
        } else {
            // Your existing code here
            Map<String, Object> map = new HashMap<>();
            map.put("content", content);
            map.put("user", user);
            RestTemplate restTemplate = new RestTemplate();
            staticService.insStat(content, "高分选题");

            StringBuilder url = new StringBuilder(RESTURL_GPT + "/high_scoring_topics/high_scoring_topics?");
            for (Map.Entry<String, Object> entry : map.entrySet()) {
                url.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
            }
            String urlString = url.toString();
            urlString = urlString.substring(0, url.length() - 1);
            ResponseEntity<String> response = restTemplate.getForEntity(urlString, String.class);
            System.out.println("接收到的消息为:" + response.getBody());
            resule = response.getBody();
        }


        PrintWriter out = null;
        try {
            out = httpServletResponse.getWriter();
            out.append(resule);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (out != null) {
                out.close();
            }
        }

    }


    @Operation(summary = "检索", description = "第一个筛选, 输入检索词, 返回左侧文章列表")
    @PostMapping(value = "search")
    public String search(@RequestBody ArticleSearchVo articleSearchVo) {
        /**
         * 增加检索记录
         */
        try {
            if (articleSearchVo.getAddSearch() == 1) {
                Db.use().insert(Entity.create("search_history").set("uid", UserUtil.getUserUid()).set("param", articleSearchVo.getPram()));
            }
        } catch (SQLException e) {
            e.printStackTrace(System.err);
        }

        /**
         * 动态获取phpUrl
         */
        String pram = articleSearchVo.getPram();

        String finalPrarm = pram + " AND (\"N ENGL J MED\"[TA] OR \"LANCET\"[TA] OR \"JAMA\"[TA] OR \"CELL\"[TA] OR \"NATURE\"[TA] OR \"SCIENCE\"[TA])";
        staticService.insStat(finalPrarm, "检索");
        List<Integer> collect = PmidUtils.searchFromPubmed(finalPrarm);
        StringBuilder finalParam = new StringBuilder();
        finalParam.append("pmid=");
        for (Integer i : collect) {
            finalParam.append(i).append(",");
        }
        if (!collect.isEmpty()) {
            articleSearchVo.setPram(finalParam.toString());
            System.out.println("试用的是Pubmed接口,数据长度为" + collect.size());
        } else {
            System.out.println("使用的还是ES接口");
        }
        //获取php url 结束


        User user = UserUtil.getUserUnloginDeniey();
        articleSearchVo.setUid(user.getUid());
        articleSearchVo.setGid(user.getGid());
        articleSearchVo.setRealName(user.getRealname());
        articleSearchVo.setType("HIGH_SCORING_TOPICS");//设置类型为高分选题 排除
        //articleSearchVo.setIsCns(1);//医学六大刊 这个地方前端参数也默认加上了 后端再加一遍
        return HttpUtil.post(RESTURL_ES + "/search/search", JSONUtil.toJsonStr(articleSearchVo));
    }

    @Operation(summary = "检索", description = "第一个筛选, 输入检索词, 返回左侧文章列表")
    @PostMapping(value = "search_right")
    public String search_right(@RequestBody ArticleSearchVo articleSearchVo) {

        /**
         * 动态获取phpUrl
         */
        List<Integer> collect = PmidUtils.searchFromPubmed(articleSearchVo.getPram());
        StringBuilder finalParam = new StringBuilder();
        finalParam.append("pmid=");
        for (Integer i : collect) {
            finalParam.append(i).append(",");
        }
        if (!collect.isEmpty()) {
            articleSearchVo.setPram(finalParam.toString());
            System.out.println("试用的是Pubmed接口,数据长度为" + collect.size());
        } else {
            System.out.println("使用的还是ES接口");
        }
        //获取php url 结束

        staticService.insStat(articleSearchVo.getPram(), "检索");

        User user = UserUtil.getUserUnloginDeniey();

        articleSearchVo.setUid(user.getUid());
        articleSearchVo.setGid(user.getGid());
        articleSearchVo.setRealName(user.getRealname());
        articleSearchVo.setType("HIGH_SCORING_TOPICS");//设置类型为高分选题 排除
        // articleSearchVo.setIsCns(1);//医学六大刊 这个地方前端参数也默认加上了 后端再加一遍

        return HttpUtil.post(RESTURL_ES + "/search/search", JSONUtil.toJsonStr(articleSearchVo));
    }



    @Operation(summary = "检索记录", description = "返回当前人的检索记录前30条")
    @PostMapping(value = "search_list")
    public ResultBean<Object> search_list() {

        try {
            List<Entity> query = Db.use().query("SELECT * FROM search_history WHERE 1=1 AND uid = " + UserUtil.getUserUid() + "  ORDER BY id DESC  LIMIT 30 ");
            return new ResultBean<>(query);
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return null;
    }

    @Operation(summary = "删除记录", description = "根据ID删除记录")
    @PostMapping(value = "delete")
    public ResultBean<Object> delete(int id) {
        try {
            String sql = "DELETE FROM search_history WHERE 1=1 and  id = ?";
            int rowsAffected = Db.use().execute(sql, id);
            if (rowsAffected > 0) {
                return new ResultBean<>("删除成功");
            } else {
                return new ResultBean<>("未找到匹配的记录");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }


}
